import { createI18n, useI18n, I18nOptions } from 'vue-i18n';
import { ref, toRef,Ref} from 'vue';

/** 【文件说明】：国际化服务类，提供多语言切换的支持，包括文本翻译、时间日期格式本地化等。
 *  【使用例子】：
 
    //1.在你的主文件（通常是 main.ts 或 app.vue）中使用这个国际化类：在 main.ts 中使用
    // 使用国际化插件
    app.use(i18nService.getI18nInstance());

    //2.使用
    import i18nService from './path-to-your-i18n-service-class';

    const translatedText = computed(() => i18nService.t(originalText));
    const formattedDate = computed(() => i18nService.d(dateValue, 'long'));
 */
/**
 * 国际化服务类，提供多语言切换的支持，包括文本翻译、时间日期格式本地化等。
 */
class I18nService {
  private i18n: ReturnType<typeof createI18n>;
  private locale = ref('en'); // 默认语言
  private globalLocale: Ref<string>;

  /**
   * 构造函数，初始化国际化实例。
   * @param options - 国际化选项。
   */
  constructor(options: I18nOptions) {
    this.i18n = createI18n(options);
    // 使用类型断言来确保类型正确
    this.globalLocale = toRef(this.i18n.global, 'locale') as Ref<string>;
  }

  /**
   * 获取当前的语言。
   * @returns 当前的语言代码。
   */
  public get currentLocale(): string {
    return this.locale.value;
  }

  /**
   * 设置当前的语言。
   * @param locale - 要设置的语言代码。
   */
  public set currentLocale(locale: string) {
    this.locale.value = locale;
    this.globalLocale.value = locale; // 使用 toRef 创建的引用
  }

  /**
   * 获取国际化实例。
   * @returns 国际化实例。
   */
  public getI18nInstance(): ReturnType<typeof createI18n> {
    return this.i18n;
  }

  /**
   * 根据键获取翻译后的文本。
   * @param key - 翻译键。
   * @param values - 插值参数。
   * @returns 翻译后的文本。
   */
  public t(key: string, values?: Record<string, any>): string {
    const { t } = useI18n();
    // 提供一个默认值以确保 values 总是 Record<string, unknown> 类型
    const safeValues: Record<string, unknown> = values || {};
    return t(key, safeValues);
  }

  /**
   * 格式化日期时间。
   * @param value - 要格式化的日期时间值。
   * @param format - 日期时间格式字符串。
   * @returns 格式化后的日期时间字符串。
   */
  public d(value: number | Date, format: string): string {
    const { d } = useI18n();
    return d(value, format);
  }
}

// 示例多语言消息和日期时间格式
const messages = {
  en: {
    message: {
      hello: 'hello world',
      welcome: 'Welcome to our app'
    }
  },
  zh: {
    message: {
      hello: '你好，世界',
      welcome: '欢迎使用我们的应用'
    }
  }
};

// 定义 DateTimeFormatOptions 类型
type DateTimeFormatOptions = Intl.DateTimeFormatOptions;

const dateTimeFormats: { [key: string]: { [key: string]: DateTimeFormatOptions } } = {
  en: {
    short: {
      year: 'numeric',
      month: 'short',
      day: 'numeric'
    },
    long: {
      year: 'numeric',
      month: 'long',
      day: 'numeric',
      weekday: 'long',
      hour: 'numeric',
      minute: 'numeric'
    }
  },
  zh: {
    short: {
      year: 'numeric',
      month: 'short',
      day: 'numeric'
    },
    long: {
      year: 'numeric',
      month: 'long',
      day: 'numeric',
      weekday: 'long',
      hour: 'numeric',
      minute: 'numeric'
    }
  }
};

// 创建并导出单例实例
const i18nService = new I18nService({
  legacy: false,
  locale: 'en',
  messages,
  datetimeFormats: dateTimeFormats // 注意这里的属性名是 datetimeFormats
});
export default i18nService;